package bancosys.tec.persist.base.domain;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OrderBy;
import javax.persistence.Table;
import javax.persistence.Transient;

import jmine.tec.persist.annotation.Alias;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.Filter;
import org.hibernate.annotations.Filters;
import org.hibernate.annotations.Type;

import bancosys.tec.persist.bussobj.AuthPersistableBusinessObject;
import bancosys.tec.persist.span.fat.FatSpanAwareBean;
import bancosys.tec.persist.span.fat.FatSpanAwareHelper;
import bancosys.tec.utils.date.Date;

/**
 * @created Mar 2, 2007
 * @author Rafael Volpato
 */
@Entity
@Filters({ @Filter(name = "authFilter", condition = "auth = :auth") })
@Table(name = "dummy_fat_span")
@Alias(value = "DMFTSP")
public class DummyFatSpanBean extends AuthPersistableBusinessObject implements FatSpanAwareBean<VigenciaDummy> {

    private Long id;

    private String nome;

    private Date data;

    private List<VigenciaDummy> vigencias;

    /**
     * @return Retorna o ID do bean.
     */
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public Long getId() {
        return this.id;
    }

    /**
     * @param id O ID a ser definido.
     */
    public void setId(Long id) {
        this.id = id;
    }

    /**
     * @return Retorna a informação 'nome' do bean
     */
    @Column(name = "NOME", length = 50)
    public String getNome() {
        return this.nome;
    }

    /**
     * @param nome O nome a ser definido.
     */
    public void setNome(String nome) {
        this.nome = nome;
    }

    /**
     * @return Retorna a data que o bean foi criado.
     */
    @Column(name = "DT_CRIACAO")
    @Type(type = "bancosys.tec.persist.hibernate.type.DateType")
    public Date getData() {
        return this.data;
    }

    /**
     * @param data A data a ser definida.
     */
    public void setData(Date data) {
        this.data = data;
    }

    /**
     * @return Returns a lista de vigencias
     */
    @OneToMany(fetch = FetchType.LAZY)
    @Cascade({ org.hibernate.annotations.CascadeType.ALL, org.hibernate.annotations.CascadeType.DELETE_ORPHAN })
    @JoinColumn(name = "FAT_ID")
    @OrderBy("dataInicio")
    public List<VigenciaDummy> getVigencias() {
        if (this.vigencias == null) {
            this.vigencias = new ArrayList<VigenciaDummy>();
        }
        return this.vigencias;
    }

    /**
     * @param vigencias A Collection de vigencias a ser definida.
     */
    public void setVigencias(List<VigenciaDummy> vigencias) {
        this.vigencias = vigencias;
    }

    /**
     * @param vigencia Vigencia para ser adicionada na lista de vigencias
     */
    public void addVigencia(VigenciaDummy vigencia) {
        this.getVigencias().add(vigencia);
    }

    public void removeVigencia(VigenciaDummy vigencia) {
        this.getVigencias().remove(vigencia);
    }

    /**
     * Devolve a última vigência.
     */
    @Transient
    public VigenciaDummy getUltimaVigencia() {
        return FatSpanAwareHelper.getUltimaVigencia(this);
    }
}
